// 需求：实现一个函数，传入什么类型，就返回什么类型，并且具有类型提示

/* function test(a) {
  // a. 这样写没有对应的类型提示
  return a
}
test(8) */

/* function test(a: number) {
  // a. // numbner 确实是有类型提示啦，但是传入其他类型就报错了
  return a
}
test(8)
test('hello') */

// 泛型：定义的时候不知道
/* function test<T>(a: T): T {
  // !这个 a 确实还是没有提示，因为 test 可以支持多种情况，所以这个 a 没有办法提示，是正常的
  return a
}
// 使用的时候才知道
// 问题解决：具有提示，又支持多种类型
test<number>(8).toFixed
test<string>('hello').length
test<{ name: string }>({ name: 'ifer' }).name */
/* function test<T>(a: T): T {
  // !这个 a 确实还是没有提示，因为 test 可以支持多种情况，所以这个 a 没有办法提示，是正常的
  return a
}
// 使用的时候才知道
// 问题解决：具有提示，又支持多种类型

let num = 8
test(num) */

// a 要是一个数组，数组里面有 T 类型
/* function test<T>(a: T[]): T[] {
  return a
}
test<string>(['hello'])
test<number>([8]) */

interface Ilength {
  length: number
}

function test<T extends Ilength>(a: T): T {
  return a
}
// test<string>('hello')
// test<number[]>([1, 2, 3])
test<{ length: number }>({ length: 888 })

export {}
